Game xếp hình Tetris C#
- Tetris.cs
- project /
1 using System;
2
3 namespace Tetris
4 {
5 /// <summary>
6 /// Descripción breve de Tetris.
7 /// </summary>
8 public class Tetris
9 {
10 private Pieza [] m_matrizPiezas;
11 private MatrizPantalla m_matrizPantalla;
12 private Pieza m_piezaActual;
13 private Pieza m_piezaSiguiente;
14 private bool m_juegoTerminado;
15 private int m_puntuacion;
16 private int m_nivel;
17 private int m_numLineas;
18 private Random r;
19
20 #region Constructor
21 public Tetris()
22 {
23 m_matrizPantalla = new MatrizPantalla();
24 m_matrizPiezas = new Pieza[Constantes.NUM_PIEZAS];
25 string formaPieza1 = "";
26 string formaPieza2 = "";
27 string formaPieza3 = "";
28 string formaPieza4 = "";
29
30 // **
31 // Pieza **
32 // Observacion: Esa Pieza no Rota
33 formaPieza1 += "1100";
34 formaPieza1 += "1100";
35 formaPieza1 += "0000";
36 formaPieza1 += "0000";
37
38 m_matrizPiezas[0] = new Pieza(formaPieza1, formaPieza1, formaPieza1, formaPieza1, 7);
39
40 //
41 // Pieza ****
42 // Observacion: Esa Pieza solo tiene 2 posiciones
43 formaPieza1 = "";
44 formaPieza1 += "1000";
45 formaPieza1 += "1000";
46 formaPieza1 += "1000";
47 formaPieza1 += "1000";
48
49 formaPieza2 = "";
50 formaPieza2 += "0000";
51 formaPieza2 += "1111";
52 formaPieza2 += "0000";
53 formaPieza2 += "0000";
54
55 m_matrizPiezas[1] = new Pieza(formaPieza1, formaPieza2, formaPieza1, formaPieza2, 1);
56
57 // *
58 // Pieza ***
59 formaPieza1 = "";
60 formaPieza1 += "1100";
61 formaPieza1 += "1000";
62 formaPieza1 += "1000";
63 formaPieza1 += "0000";
64
65 formaPieza2 = "";
66 formaPieza2 += "1110";
67 formaPieza2 += "0010";
68 formaPieza2 += "0000";
69 formaPieza2 += "0000";
70
71 formaPieza3 = "";
72 formaPieza3 += "0100";
73 formaPieza3 += "0100";
74 formaPieza3 += "1100";
75 formaPieza3 += "0000";
76
77 formaPieza4 = "";
78 formaPieza4 += "1000";
79 formaPieza4 += "1110";
80 formaPieza4 += "0000";
81 formaPieza4 += "0000";
82 m_matrizPiezas[2] = new Pieza(formaPieza1, formaPieza2, formaPieza3, formaPieza4, 2);
83
84 // *
85 // Pieza ***
86 formaPieza1 = "";
87 formaPieza1 += "1000";
88 formaPieza1 += "1100";
89 formaPieza1 += "1000";
90 formaPieza1 += "0000";
91
92 formaPieza2 = "";
93 formaPieza2 += "1110";
94 formaPieza2 += "0100";
95 formaPieza2 += "0000";
96 formaPieza2 += "0000";
97
98 formaPieza3 = "";
99 formaPieza3 += "0100";
100 formaPieza3 += "1100";
101 formaPieza3 += "0100";
102 formaPieza3 += "0000";
103
104 formaPieza4 = "";
105 formaPieza4 += "0100";
106 formaPieza4 += "1110";
107 formaPieza4 += "0000";
108 formaPieza4 += "0000";
109 m_matrizPiezas[3] = new Pieza(formaPieza1, formaPieza2, formaPieza3, formaPieza4, 3);
110
111 // **
112 // Pieza **
113 // Observacion: Esa formaPieza solo tiene 2 posiciones
114 formaPieza1 = "";
115 formaPieza1 += "0110";
116 formaPieza1 += "1100";
117 formaPieza1 += "0000";
118 formaPieza1 += "0000";
119
120 formaPieza2 = "";
121 formaPieza2 += "1000";
122 formaPieza2 += "1100";
123 formaPieza2 += "0100";
124 formaPieza2 += "0000";
125 m_matrizPiezas[4] = new Pieza(formaPieza1, formaPieza2, formaPieza1, formaPieza2, 4);
126
127 // **
128 // Pieza **
129 // Observacion: Esa formaPieza solo tiene 2 posiciones
130 formaPieza1 = "";
131 formaPieza1 += "1100";
132 formaPieza1 += "0110";
133 formaPieza1 += "0000";
134 formaPieza1 += "0000";
135
136 formaPieza2 = "";
137 formaPieza2 += "0100";
138 formaPieza2 += "1100";
139 formaPieza2 += "1000";
140 formaPieza2 += "0000";
141
142 m_matrizPiezas[5] = new Pieza(formaPieza1, formaPieza2, formaPieza1, formaPieza2, 5);
143
144 // *
145 // Pieza ***
146 formaPieza1 = "";
147 formaPieza1 += "1100";
148 formaPieza1 += "0100";
149 formaPieza1 += "0100";
150 formaPieza1 += "0000";
151
152 formaPieza2 = "";
153 formaPieza2 += "1110";
154 formaPieza2 += "1000";
155 formaPieza2 += "0000";
156 formaPieza2 += "0000";
157
158 formaPieza3 = "";
159 formaPieza3 += "1000";
160 formaPieza3 += "1000";
161 formaPieza3 += "1100";
162 formaPieza3 += "0000";
163
164 formaPieza4 = "";
165 formaPieza4 += "0010";
166 formaPieza4 += "1110";
167 formaPieza4 += "0000";
168 formaPieza4 += "0000";
169 m_matrizPiezas[6] = new Pieza(formaPieza1, formaPieza2, formaPieza3, formaPieza4, 6);
170
171 r = new Random(unchecked((int)DateTime.Now.Ticks));
172 //nuevoJuego();
173 m_juegoTerminado = true;
174 }
175 #endregion
176
177
178 public int [, ]matrizPantalla
179 {
180 get
181 {
182 return m_matrizPantalla.matrizPantalla;
183 }
184 }
185
186 public bool juegoTerminado
187 {
188 get
189 {
190 return m_juegoTerminado;
191 }
192 }
193
194 public Pieza piezaSiguiente
195 {
196 get
197 {
198 return m_piezaSiguiente;
199 }
200 }
201
202 public int puntuacion
203 {
204 get
205 {
206 return m_puntuacion;
207 }
208 }
209
210 public int numLineas
211 {
212 get
213 {
214 return m_numLineas;
215 }
216 }
217
218 public int nivel
219 {
220 get
221 {
222 return m_nivel;
223 }
224 }
225
226 private Pieza nuevaPieza()
227 {
228 int a = r.Next(0, Constantes.NUM_PIEZAS);
229 Pieza p = (Pieza)((Pieza)m_matrizPiezas[a]).Clone();
230 return p;
231 }
232
233 public void muevePiezaAbajo()
234 {
235 int numLineasHechas;
236 Pieza pTemp = (Pieza)m_piezaActual.Clone();
237 m_matrizPantalla.borrarPieza(m_piezaActual);
238 pTemp.posY = pTemp.posY + 1;
239 if (m_matrizPantalla.puedeBajarPieza(pTemp))
240 {
241 m_piezaActual = pTemp;
242 }
243 else
244 {
245 m_matrizPantalla.pintarPieza(m_piezaActual);
246 m_piezaActual = m_piezaSiguiente;
247 if (!m_matrizPantalla.puedeBajarPieza(m_piezaActual) && m_piezaActual.posY < 0)
248 {
249 m_juegoTerminado = true;
250 }
251 m_piezaSiguiente = nuevaPieza();
252 m_puntuacion += 4;
253 numLineasHechas = compruebaLineasCompletas();
254 if (numLineasHechas > 0)
255 m_puntuacion += calculaPuntuacion(numLineasHechas);
256 m_numLineas += numLineasHechas;
257
258 }
259 if (!m_juegoTerminado)
260 m_matrizPantalla.pintarPieza(m_piezaActual);
261 }
262
263 public void muevePiezaDerecha()
264 {
265 Pieza pTemp = (Pieza)m_piezaActual.Clone();
266 m_matrizPantalla.borrarPieza(m_piezaActual);
267 pTemp.posX = pTemp.posX + 1;
268 if (m_matrizPantalla.puedeMoverPieza(pTemp))
269 {
270 m_piezaActual = pTemp;
271 }
272 m_matrizPantalla.pintarPieza(m_piezaActual);
273 }
274
275 public void muevePiezaIzquierda()
276 {
277 Pieza pTemp = (Pieza)m_piezaActual.Clone();
278 m_matrizPantalla.borrarPieza(m_piezaActual);
279 pTemp.posX = pTemp.posX - 1;
280 if (m_matrizPantalla.puedeMoverPieza(pTemp))
281 {
282 m_piezaActual = pTemp;
283 }
284 m_matrizPantalla.pintarPieza(m_piezaActual);
285 }
286
287 public void rotaPiezaIzquierda()
288 {
289 Pieza pTemp = (Pieza)m_piezaActual.Clone();
290 m_matrizPantalla.borrarPieza(m_piezaActual);
291 pTemp.rotarIzquierda();
292 if (m_matrizPantalla.puedeMoverPieza(pTemp))
293 {
294 m_piezaActual = pTemp;
295 }
296 m_matrizPantalla.pintarPieza(m_piezaActual);
297 }
298
299 public void rotaPiezaDerecha()
300 {
301 Pieza pTemp = (Pieza)m_piezaActual.Clone();
302 m_matrizPantalla.borrarPieza(m_piezaActual);
303 pTemp.rotarDerecha();
304 if (m_matrizPantalla.puedeMoverPieza(pTemp))
305 {
306 m_piezaActual = pTemp;
307 }
308 m_matrizPantalla.pintarPieza(m_piezaActual);
309 }
310
311 public void nuevoJuego()
312 {
313 m_puntuacion = 0;
314 m_numLineas = 0;
315 m_nivel = 0;
316 inicializa();
317 }
318
319 public void nuevoNivel()
320 {
321 if (m_nivel < 9)
322 m_nivel++;
323 m_numLineas = 0;
324 inicializa();
325 }
326
327 public void inicializa()
328 {
329 m_matrizPantalla.borrarPantalla();
330 m_piezaActual = nuevaPieza();
331 System.Threading.Thread.Sleep(100); // Retardo para que no salgan las dos primeras piezas iguales
332 m_piezaSiguiente = nuevaPieza();
333 m_matrizPantalla.pintarPieza(m_piezaActual);
334 m_juegoTerminado = false;
335 }
336
337 private int compruebaLineasCompletas()
338 {
339 return m_matrizPantalla.eliminaLineasCompletas();
340 }
341
342 private int calculaPuntuacion(int numLineasHechas)
343 {
344 int puntuacion = 0;
345 switch (numLineasHechas)
346 {
347 case 1:
348 puntuacion += 13 * (m_nivel + 1) * 2;
349 break;
350 case 2:
351 puntuacion += 2 * 13 * (m_nivel + 1) * 2;
352 goto case 1;
353 case 3:
354 puntuacion += 3 * 13 * (m_nivel + 1) * 2;
355 goto case 2;
356 case 4:
357 puntuacion += 4 * 13 * (m_nivel + 1) * 2;
358 goto case 3;
359 }
360 return puntuacion;
361 }
362
363 #region Pruebas
364 /*
365 public void prueba()
366 {
367 int color = 1;
368 for (int i = 0; i < 4; i++)
369 {
370 for (int j = 0; j < 3; j++)
371 {
372 color++;
373 if (color > 7)
374 color = 1;
375 for (int k = 0; k < Constantes.FILAS_PIEZAS; k++)
376 {
377 for (int l = 0; l < Constantes.COLUMNAS_PIEZAS; l++)
378 {
379 m_matrizPantalla[(i * 4) + k + i, (j * 4) + l] = ((Pieza)m_matrizPiezas[i, j])[k, l] * color;
380 }
381 }
382 }
383 }
384 }
385 */
386 #endregion
387 }
388 }
2
3 namespace Tetris
4 {
5 /// <summary>
6 /// Descripción breve de Tetris.
7 /// </summary>
8 public class Tetris
9 {
10 private Pieza [] m_matrizPiezas;
11 private MatrizPantalla m_matrizPantalla;
12 private Pieza m_piezaActual;
13 private Pieza m_piezaSiguiente;
14 private bool m_juegoTerminado;
15 private int m_puntuacion;
16 private int m_nivel;
17 private int m_numLineas;
18 private Random r;
19
20 #region Constructor
21 public Tetris()
22 {
23 m_matrizPantalla = new MatrizPantalla();
24 m_matrizPiezas = new Pieza[Constantes.NUM_PIEZAS];
25 string formaPieza1 = "";
26 string formaPieza2 = "";
27 string formaPieza3 = "";
28 string formaPieza4 = "";
29
30 // **
31 // Pieza **
32 // Observacion: Esa Pieza no Rota
33 formaPieza1 += "1100";
34 formaPieza1 += "1100";
35 formaPieza1 += "0000";
36 formaPieza1 += "0000";
37
38 m_matrizPiezas[0] = new Pieza(formaPieza1, formaPieza1, formaPieza1, formaPieza1, 7);
39
40 //
41 // Pieza ****
42 // Observacion: Esa Pieza solo tiene 2 posiciones
43 formaPieza1 = "";
44 formaPieza1 += "1000";
45 formaPieza1 += "1000";
46 formaPieza1 += "1000";
47 formaPieza1 += "1000";
48
49 formaPieza2 = "";
50 formaPieza2 += "0000";
51 formaPieza2 += "1111";
52 formaPieza2 += "0000";
53 formaPieza2 += "0000";
54
55 m_matrizPiezas[1] = new Pieza(formaPieza1, formaPieza2, formaPieza1, formaPieza2, 1);
56
57 // *
58 // Pieza ***
59 formaPieza1 = "";
60 formaPieza1 += "1100";
61 formaPieza1 += "1000";
62 formaPieza1 += "1000";
63 formaPieza1 += "0000";
64
65 formaPieza2 = "";
66 formaPieza2 += "1110";
67 formaPieza2 += "0010";
68 formaPieza2 += "0000";
69 formaPieza2 += "0000";
70
71 formaPieza3 = "";
72 formaPieza3 += "0100";
73 formaPieza3 += "0100";
74 formaPieza3 += "1100";
75 formaPieza3 += "0000";
76
77 formaPieza4 = "";
78 formaPieza4 += "1000";
79 formaPieza4 += "1110";
80 formaPieza4 += "0000";
81 formaPieza4 += "0000";
82 m_matrizPiezas[2] = new Pieza(formaPieza1, formaPieza2, formaPieza3, formaPieza4, 2);
83
84 // *
85 // Pieza ***
86 formaPieza1 = "";
87 formaPieza1 += "1000";
88 formaPieza1 += "1100";
89 formaPieza1 += "1000";
90 formaPieza1 += "0000";
91
92 formaPieza2 = "";
93 formaPieza2 += "1110";
94 formaPieza2 += "0100";
95 formaPieza2 += "0000";
96 formaPieza2 += "0000";
97
98 formaPieza3 = "";
99 formaPieza3 += "0100";
100 formaPieza3 += "1100";
101 formaPieza3 += "0100";
102 formaPieza3 += "0000";
103
104 formaPieza4 = "";
105 formaPieza4 += "0100";
106 formaPieza4 += "1110";
107 formaPieza4 += "0000";
108 formaPieza4 += "0000";
109 m_matrizPiezas[3] = new Pieza(formaPieza1, formaPieza2, formaPieza3, formaPieza4, 3);
110
111 // **
112 // Pieza **
113 // Observacion: Esa formaPieza solo tiene 2 posiciones
114 formaPieza1 = "";
115 formaPieza1 += "0110";
116 formaPieza1 += "1100";
117 formaPieza1 += "0000";
118 formaPieza1 += "0000";
119
120 formaPieza2 = "";
121 formaPieza2 += "1000";
122 formaPieza2 += "1100";
123 formaPieza2 += "0100";
124 formaPieza2 += "0000";
125 m_matrizPiezas[4] = new Pieza(formaPieza1, formaPieza2, formaPieza1, formaPieza2, 4);
126
127 // **
128 // Pieza **
129 // Observacion: Esa formaPieza solo tiene 2 posiciones
130 formaPieza1 = "";
131 formaPieza1 += "1100";
132 formaPieza1 += "0110";
133 formaPieza1 += "0000";
134 formaPieza1 += "0000";
135
136 formaPieza2 = "";
137 formaPieza2 += "0100";
138 formaPieza2 += "1100";
139 formaPieza2 += "1000";
140 formaPieza2 += "0000";
141
142 m_matrizPiezas[5] = new Pieza(formaPieza1, formaPieza2, formaPieza1, formaPieza2, 5);
143
144 // *
145 // Pieza ***
146 formaPieza1 = "";
147 formaPieza1 += "1100";
148 formaPieza1 += "0100";
149 formaPieza1 += "0100";
150 formaPieza1 += "0000";
151
152 formaPieza2 = "";
153 formaPieza2 += "1110";
154 formaPieza2 += "1000";
155 formaPieza2 += "0000";
156 formaPieza2 += "0000";
157
158 formaPieza3 = "";
159 formaPieza3 += "1000";
160 formaPieza3 += "1000";
161 formaPieza3 += "1100";
162 formaPieza3 += "0000";
163
164 formaPieza4 = "";
165 formaPieza4 += "0010";
166 formaPieza4 += "1110";
167 formaPieza4 += "0000";
168 formaPieza4 += "0000";
169 m_matrizPiezas[6] = new Pieza(formaPieza1, formaPieza2, formaPieza3, formaPieza4, 6);
170
171 r = new Random(unchecked((int)DateTime.Now.Ticks));
172 //nuevoJuego();
173 m_juegoTerminado = true;
174 }
175 #endregion
176
177
178 public int [, ]matrizPantalla
179 {
180 get
181 {
182 return m_matrizPantalla.matrizPantalla;
183 }
184 }
185
186 public bool juegoTerminado
187 {
188 get
189 {
190 return m_juegoTerminado;
191 }
192 }
193
194 public Pieza piezaSiguiente
195 {
196 get
197 {
198 return m_piezaSiguiente;
199 }
200 }
201
202 public int puntuacion
203 {
204 get
205 {
206 return m_puntuacion;
207 }
208 }
209
210 public int numLineas
211 {
212 get
213 {
214 return m_numLineas;
215 }
216 }
217
218 public int nivel
219 {
220 get
221 {
222 return m_nivel;
223 }
224 }
225
226 private Pieza nuevaPieza()
227 {
228 int a = r.Next(0, Constantes.NUM_PIEZAS);
229 Pieza p = (Pieza)((Pieza)m_matrizPiezas[a]).Clone();
230 return p;
231 }
232
233 public void muevePiezaAbajo()
234 {
235 int numLineasHechas;
236 Pieza pTemp = (Pieza)m_piezaActual.Clone();
237 m_matrizPantalla.borrarPieza(m_piezaActual);
238 pTemp.posY = pTemp.posY + 1;
239 if (m_matrizPantalla.puedeBajarPieza(pTemp))
240 {
241 m_piezaActual = pTemp;
242 }
243 else
244 {
245 m_matrizPantalla.pintarPieza(m_piezaActual);
246 m_piezaActual = m_piezaSiguiente;
247 if (!m_matrizPantalla.puedeBajarPieza(m_piezaActual) && m_piezaActual.posY < 0)
248 {
249 m_juegoTerminado = true;
250 }
251 m_piezaSiguiente = nuevaPieza();
252 m_puntuacion += 4;
253 numLineasHechas = compruebaLineasCompletas();
254 if (numLineasHechas > 0)
255 m_puntuacion += calculaPuntuacion(numLineasHechas);
256 m_numLineas += numLineasHechas;
257
258 }
259 if (!m_juegoTerminado)
260 m_matrizPantalla.pintarPieza(m_piezaActual);
261 }
262
263 public void muevePiezaDerecha()
264 {
265 Pieza pTemp = (Pieza)m_piezaActual.Clone();
266 m_matrizPantalla.borrarPieza(m_piezaActual);
267 pTemp.posX = pTemp.posX + 1;
268 if (m_matrizPantalla.puedeMoverPieza(pTemp))
269 {
270 m_piezaActual = pTemp;
271 }
272 m_matrizPantalla.pintarPieza(m_piezaActual);
273 }
274
275 public void muevePiezaIzquierda()
276 {
277 Pieza pTemp = (Pieza)m_piezaActual.Clone();
278 m_matrizPantalla.borrarPieza(m_piezaActual);
279 pTemp.posX = pTemp.posX - 1;
280 if (m_matrizPantalla.puedeMoverPieza(pTemp))
281 {
282 m_piezaActual = pTemp;
283 }
284 m_matrizPantalla.pintarPieza(m_piezaActual);
285 }
286
287 public void rotaPiezaIzquierda()
288 {
289 Pieza pTemp = (Pieza)m_piezaActual.Clone();
290 m_matrizPantalla.borrarPieza(m_piezaActual);
291 pTemp.rotarIzquierda();
292 if (m_matrizPantalla.puedeMoverPieza(pTemp))
293 {
294 m_piezaActual = pTemp;
295 }
296 m_matrizPantalla.pintarPieza(m_piezaActual);
297 }
298
299 public void rotaPiezaDerecha()
300 {
301 Pieza pTemp = (Pieza)m_piezaActual.Clone();
302 m_matrizPantalla.borrarPieza(m_piezaActual);
303 pTemp.rotarDerecha();
304 if (m_matrizPantalla.puedeMoverPieza(pTemp))
305 {
306 m_piezaActual = pTemp;
307 }
308 m_matrizPantalla.pintarPieza(m_piezaActual);
309 }
310
311 public void nuevoJuego()
312 {
313 m_puntuacion = 0;
314 m_numLineas = 0;
315 m_nivel = 0;
316 inicializa();
317 }
318
319 public void nuevoNivel()
320 {
321 if (m_nivel < 9)
322 m_nivel++;
323 m_numLineas = 0;
324 inicializa();
325 }
326
327 public void inicializa()
328 {
329 m_matrizPantalla.borrarPantalla();
330 m_piezaActual = nuevaPieza();
331 System.Threading.Thread.Sleep(100); // Retardo para que no salgan las dos primeras piezas iguales
332 m_piezaSiguiente = nuevaPieza();
333 m_matrizPantalla.pintarPieza(m_piezaActual);
334 m_juegoTerminado = false;
335 }
336
337 private int compruebaLineasCompletas()
338 {
339 return m_matrizPantalla.eliminaLineasCompletas();
340 }
341
342 private int calculaPuntuacion(int numLineasHechas)
343 {
344 int puntuacion = 0;
345 switch (numLineasHechas)
346 {
347 case 1:
348 puntuacion += 13 * (m_nivel + 1) * 2;
349 break;
350 case 2:
351 puntuacion += 2 * 13 * (m_nivel + 1) * 2;
352 goto case 1;
353 case 3:
354 puntuacion += 3 * 13 * (m_nivel + 1) * 2;
355 goto case 2;
356 case 4:
357 puntuacion += 4 * 13 * (m_nivel + 1) * 2;
358 goto case 3;
359 }
360 return puntuacion;
361 }
362
363 #region Pruebas
364 /*
365 public void prueba()
366 {
367 int color = 1;
368 for (int i = 0; i < 4; i++)
369 {
370 for (int j = 0; j < 3; j++)
371 {
372 color++;
373 if (color > 7)
374 color = 1;
375 for (int k = 0; k < Constantes.FILAS_PIEZAS; k++)
376 {
377 for (int l = 0; l < Constantes.COLUMNAS_PIEZAS; l++)
378 {
379 m_matrizPantalla[(i * 4) + k + i, (j * 4) + l] = ((Pieza)m_matrizPiezas[i, j])[k, l] * color;
380 }
381 }
382 }
383 }
384 }
385 */
386 #endregion
387 }
388 }